With the proliferation of software products and services, attempts have been made to codify and/or standardize the designing of software and software architecture. Examples include:
The Booch Method and Modeling Language (see “Object Oriented Analysis and Design” by Grady Booch);
James Rumbaugh and Associates' Object Modeling Technique (OMT);
the Object Oriented Software Engineering (OOSE) method by Ivar Jacobson; and
the Unified Modeling Language (UML) which combines the foregoing and industry best practices.
The UML is a visual modeling language (with formal syntax and semantics) for communicating a model or conceptionalization. Thus the modeling language specification specifies modeling elements, notation and usage guidelines and not order of activities, specification of artifacts, repository interface, storage, run-time behavior and so forth. In general, at the modeling level a “problem” is posed in terms of a customer's needs and requirements and may be referred to as the business problem system. The software designer develops a “solution” software product and or service that addresses the problem. The UML syntax enables software designers to express (specify and document) the subject problems and solutions in a standardized manner, while the UML semantics enable knowledge about the subject system to be captured and leveraged during the problem solving phase. See “UML in a Nutshell” by Simon Si Alhir, published by O'Reilly & Associates, September 1998. As such, the UML enables the sharing of information (including prior solution portions) and extension (without reimplementation) of core object oriented concepts (analysis and design) during the iterative problem-solving process for designing software products.
The adopted UML 2.0 specification uses a so called “package merge” to define a number of different modeling languages and compliance levels. A “package” is a grouping of semantically related model elements and serves as a container for model elements that may be instantiated. A “relationship” is a connection between model elements that adds semantics to models. A “package merge” is a relationship between two packages where the contents of the target (merged) package are merged with the contents of the source (merging) package through specialization and redefinition. It is semantically equivalent to defining a subclass in the source package of every class in the target package. A package merge is indicated by a visibility relationship with a <<merge>> stereotype between two packages in a model.
The Rose model for UML 2.0 Superstructure contains many package merge relationships. In a lot of cases, the specialization relationships have been explicitly included. In some cases, the corresponding redefinitions have also been explicitly defined. In most instances, however, this is not the case. Most redefinitions are implicitly defined through matching names as specified by the package merge semantics. Package merge does not introduce any new semantics into UML 2.0; it is only a convenience for specifying a set of generalizations and redefinitions. These generalizations and redefinitions can just as well be specified explicitly. In fact, UML 2.0 Infrastructure does not use package merge, but instead does the merge “by hand” and explicitly specifies all the generalizations and redefinitions.
The Eclipse Modeling Framework (EMF) can be used to generate Java code from a Rose model, but encounters a number of issues when dealing with redefinitions. Even if the Rose model and/or the EMF code generator were modified to resolve these issues, the resulting implementation would still be unusable. The source of this problem is the way redefinition was used throughout the specification as a means of partitioning the model into levels of compliance. This may make sense at a conceptual level, but it complicates the target Application Program Interface (API) to a great extent.
Although not introduced by package merge, these problems are exacerbated significantly by the shear number of package merges specified in the UML 2.0 Superstructure. Some of the issues, most resulting from redefinitions, are:
Results in a huge class hierarchy with multiple packages having classes with the same name.
Creates a very large number of uninteresting redefinitions (property redefinitions that do not change anything but the type, which cannot be handled by Java anyway).
Creates a lot of instances of multiple inheritance of properties having the same name.
A “downcast” model-to-model mapping from more general instances to more specific instances is required in order to use the existing general model instances in an extended API.
A more specific class does not contain some of its redefined constraints because the property has to be implemented in its superclass.
Client applications have to do a lot of downcasting because Java cannot implement UML 2.0 redefinition semantics; after the many levels of merges in UML 2.0, client developers will likely find it difficult to remember what has to be cast to what and when, leading to unexpected results.
Merged constraints are lost for matching properties because, due to Java limitations, the superclass property is chosen when eliminating the property redefinitions.
Using any of the inherited superclasses requires the client application to use a fully qualified class name.